/*
 * Copyright 2010 Michael Nitsche
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.mnit.schnipsel.swt.dialog.konfig;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;

import de.mnit.basis.daten.konstant.position.POSITION_GERADE;
import de.mnit.basis.daten.konstant.position.POSITION_V;
import de.mnit.basis.db.konstant.DBMS;
import de.mnit.basis.db.zugang.DBZugang;
import de.mnit.basis.db.zugang.S_DBZugang;
import de.mnit.basis.fehler.Fehler;
import de.mnit.basis.fehler.system.F_Sys_Datei;
import de.mnit.basis.fehler.system.F_Sys_InOut;
import de.mnit.basis.swt.anw.A_MN_Gruppe;
import de.mnit.basis.swt.dialog.SWT_Dialog;
import de.mnit.basis.swt.dialog.SWT_Fehler;
import de.mnit.basis.swt.element.S_SWT_Komponente;
import de.mnit.basis.swt.element.steuer.SWT_Knopf;
import de.mnit.basis.swt.element.steuer.SWT_Knopf_Auswahl;
import de.mnit.basis.swt.element.steuer.SWT_Knopf_Wechsel;
import de.mnit.basis.swt.element.steuer.SWT_Label;
import de.mnit.basis.swt.element.steuer.rollbar.SWT_TextEingabe;
import de.mnit.basis.swt.grafik.icon.direkt.ICON;
import de.mnit.basis.swt.layout.Ebene;
import de.mnit.basis.swt.layout.Layout2;
import de.mnit.basis.swt.layout.LayoutGitter;
import de.mnit.basis.swt.layout.LayoutKnopfWechsel;
import de.mnit.basis.sys.datei.DSDatei;
import de.mnit.basis.sys.sprache.S;
import de.mnit.schnipsel.db.DBKonfig;
import de.mnit.schnipsel.zentral.SC_DateiSys;
import de.mnit.schnipsel.zentral.SC_Events;
import de.mnit.schnipsel.zentral.SC_Portable;

/**
 * @author Michael Nitsche
 * 05.07.2010	Erstellt
 */
public class K_KonfigDB extends A_MN_Gruppe<K_KonfigDB> implements S_KonfigSeite<K_KonfigDB> {

	public static void main(String[] args)   { start(K_KonfigDB.class, 450, 400); }


	private static final S s=new S(K_KonfigDB.class);
	private static final String Text_DB=s.t("DB:");
	private final SWT_Knopf_Auswahl k_lokal		= new SWT_Knopf_Auswahl(s.t("Standard"));
	private final SWT_Knopf_Auswahl k_hsqldb	= new SWT_Knopf_Auswahl(s.t("HSqlDB"));
	private final SWT_Knopf_Auswahl k_mysql		= new SWT_Knopf_Auswahl(s.t("MySQL"));
	private final SWT_Knopf_Wechsel k_portable	= new SWT_Knopf_Wechsel();
	private final SWT_Knopf			k_dateisuche= new SWT_Knopf();
	private final SWT_TextEingabe	k_host		= new SWT_TextEingabe();
	private final SWT_TextEingabe	k_user		= new SWT_TextEingabe();
	private final SWT_TextEingabe	k_pass		= new SWT_TextEingabe();
	private final SWT_TextEingabe	k_db		= new SWT_TextEingabe();
	private final SWT_Label			k_text_host	= new SWT_Label();
	private final SWT_Label			k_text_user	= new SWT_Label();
	private final SWT_Label			k_text_pass	= new SWT_Label();
	private final SWT_Label			k_text_db	= new SWT_Label();
	private S_DBZugang init=null;


	public boolean oeffnen() {
		try {
			DBKonfig konfig = new DBKonfig();
			this.init=konfig.gib(1);
			this.k_portable.sWert(SC_Portable.gib()); //Unbedingt vor dem setzen der restlichen Daten
			iSetze(this.init);
			return true;
		}
		catch(F_Sys_InOut e) {
			SWT_Fehler.zeig(e, false);
			return false;
		}
	}

	public boolean speichern() {
		try {
			DBKonfig konfig = new DBKonfig();
			S_DBZugang z=iErgebnis();
			if(z!=null) {
				konfig.setze(1, z);
				SC_Events.i().neuVerbinden();
			}
		}
		catch(F_Sys_InOut e) {
			SWT_Fehler.zeig(e, false);
		}
		return true;
	}

	// ERSTELLEN

	protected S_SWT_Komponente<?, ? extends Composite> layout() {
		LayoutKnopfWechsel oben_links=LayoutKnopfWechsel.neu(!true, t.k_lokal, t.k_hsqldb, t.k_mysql);
		Layout2 oben=Layout2.neu(t.k_portable, POSITION_GERADE.RECHTS, 50, oben_links);

		LayoutGitter unten = LayoutGitter.neu()
			.sSpaltenAnzahl(3)
			.sAussenabstand(5)
			.sKomponente(t.k_text_host)
				.sBreite(75)
				.sPositionV(POSITION_V.MITTE)
			.sKomponente(t.k_host)
				.sUebergreifendH(2)
				.sFlexibelH()
			.sKomponente(t.k_text_user)
				.sPositionV(POSITION_V.MITTE)
			.sKomponente(t.k_user)
				.sUebergreifendH(2)
				.sFlexibelH()
			.sKomponente(t.k_text_pass)
				.sPositionV(POSITION_V.MITTE)
			.sKomponente(t.k_pass)
				.sUebergreifendH(2)
				.sFlexibelH()
			.sKomponente(t.k_text_db)
				.sPositionV(POSITION_V.MITTE)
			.sKomponente(t.k_db)
				.sFlexibelH()
			.sKomponente(t.k_dateisuche)
				.sBreite(35)
			.fertig();

		return LayoutGitter.neu()
			.sSpaltenAnzahl(1)
			.sZwischenraumV(5)
			.sAussenabstand(5)
			.sKomponente(oben)
				.sFlexibelH()
				.fertig()
			.sKomponente(Ebene.neu(unten))
				.sFlexibelH()
				.fertig()
			;
	}

	protected void initStyle() {
		t.k_text_db.sText(Text_DB);
		t.k_text_user.sText(s.t("Benutzer:"));
		t.k_text_pass.sText(s.t("Passwort:"));
		t.k_text_host.sText(s.t("Host:"));

		t.k_pass.sVerdeckt();

		t.k_dateisuche.sBild(ICON._16.OBJ_LUPE);
		t.k_portable.sBild(ICON._16.OBJ_SCHRITT);
		t.k_portable.sTip(s.t("Portable"));

		t.k_host.sFokus();
	}

	protected void initEvents() {
		t.k_lokal.eAuswahl(new Listener() {
			public void handleEvent(Event e) {
				iLokal();
			}
		});
		t.k_hsqldb.eAuswahl(new Listener() {
			public void handleEvent(Event e) {
				iHSQLDB(null);
			}
		});
		t.k_mysql.eAuswahl(new Listener() {
			public void handleEvent(Event e) {
				iMYSQL(null);
			}
		});

		t.k_dateisuche.eAuswahl(new Listener() {
			public void handleEvent(Event e) {
				String[] datei=SWT_Dialog.frage_Datei("Datenbank auswählen");
				if(datei!=null && datei.length==1)
					t.k_db.sText(new DSDatei(datei[0]).gPfadKomplett());
			}
		});

		t.k_portable.eAuswahl(new Listener(){
			public void handleEvent(Event arg0) {
				try {
					SC_Portable.setze(t.k_portable.gWert());
					if(t.k_lokal.gWert())
						iLokal();
				}
				catch(F_Sys_InOut e) {
					e.printStackTrace();
				}
			}
		});
	}

	private void iSetze(S_DBZugang dbz) {
		if(dbz.gDBMS()==DBMS.HSQLDB)
			this.iHSQLDB(dbz);
		else if(dbz.gDBMS()==DBMS.MYSQL)
			this.iMYSQL(dbz);
		else Fehler.sonstige.da_ToDo(dbz.gDBMS(), dbz);
	}

	private S_DBZugang iErgebnis() {
		DBMS dbms=this.k_mysql.gWert() ? DBMS.MYSQL : DBMS.HSQLDB;
		String host=this.k_host.gText();
		String db  =this.k_db.gText();
		String user=this.k_user.gText();
		String pass=this.k_pass.gText();

		if(this.init!=null) {
			if(	host.equals(this.init.gHost()) &&
				db	.equals(this.init.gDB()) &&
				user.equals(this.init.gUser()) &&
				pass.equals(this.init.gPass()))
					return null;
		}
		return new DBZugang(dbms, host, db, user, pass);
	}

	private void iLokal() {
		iAktiv(false, false, false, false, false);
		t.k_text_db.sText(s.t("DB/Datei:"));
		t.k_user.sText("sa");
		t.k_db.sText(iStdOrdner());
		iAuswahl(1);
	}

	private void iHSQLDB(S_DBZugang dbz) {
		if(dbz!=null && iStdOrdner().equals(dbz.gDB())) {
			this.iLokal();
			return;
		}
		iAktiv(true, true, true, true, true);
		t.k_text_db.sText("DB/Datei:");
		iAuswahl(2);
		iSetzeFelder(dbz);
	}

	private void iMYSQL(S_DBZugang dbz) {
		iAktiv(true, true, true, true, false);
		t.k_text_db.sText("DB:");
		iAuswahl(3);
		iSetzeFelder(dbz);
	}

	private void iAuswahl(int i) {
		t.k_lokal.sWert(i==1);
		t.k_hsqldb.sWert(i==2);
		t.k_mysql.sWert(i==3);
	}

	private void iAktiv(boolean host, boolean user, boolean pass, boolean db, boolean dateisuche) {
		t.k_host.sAktiviert(host);
		t.k_user.sAktiviert(user);
		t.k_pass.sAktiviert(pass);
		t.k_db.sAktiviert(db);
		t.k_dateisuche.sAktiviert(dateisuche);
		if(!host) this.k_host.sText("");
		if(!user) this.k_user.sText("");
		if(!pass) this.k_pass.sText("");
		if(!db  ) this.k_db.sText("");
	}

	private void iSetzeFelder(S_DBZugang dbz) {
		if(dbz==null)
			return;
		this.k_host.sText(dbz.gHost());
		this.k_user.sText(dbz.gUser());
		this.k_pass.sText(dbz.gPass());
		this.k_db  .sText(dbz.gDB());
	}

	private String iStdOrdner() {
		try {
			return this.k_portable.gWert()
				? SC_DateiSys.gPortableDB()
				: SC_DateiSys.gStandardDB().gPfadKomplett();
		}
		catch(F_Sys_Datei e) {
			throw Fehler.zeig(e);
		}
	}

}
